#include <iostream>
#include <string>

//代码的复用性

//模板关键字
//typename : 定义后面跟的变量是数据类型
//T : 参数化的数据类型变量名
//<> : 参数名
template<typename T>   //模板函数
T add(T a,T b)
{
    std::cout<<"add(T,T)\n"
    return a + b;
}

int add(int a,int b)
{
    std::cout<<"add(int,int)\n";
    return a + b;
}

int main()
{
    // //显式调用模板函数
    // int a = add<int>(1,2);
    // //隐式调用：自动类型推导
    // int b = add(1,2);
    // //double b = add<double>(3.11,2.4);
    
    // std::cout<<a<<" "<<b<<std::endl;
    //当模板函数遇上普通函数
    //如果类型匹配，优先普通函数
    //如果类型不匹配，优先模板函数
    //模板不支持类型的隐式转换
    //显式调用模板函数支持参数的隐式转换
    int a = add(1.1,2.2);

    return 0;
}